连接查询,join
连接,多个表记录之间的连接!
场景:
需要得到一个学生列表,要求是,展示:
学生,性别,班级名字
此时 需要 不单从 学生表获取数据,还需要从 班级表获得数据!
语法:
from 表名1 join 表名2 on 连接条件
过程是,先执行 from子句,需要连接join。
两个特殊的地方:
join ,连接
on ,连接条件
join 连接语法
---------
除了默认的连接之外,有其他形式的连接方式
内连接
外连接,左外连接,右外连接,[全外连接,也是外连接,但是不是mysql所支持的]
交叉连接
自然连接
### 内连接,inner join
记录与真实的记录连接,称之为内连接!(两条真实存在的记录的连接)
mysql默认的连接就是 inner join
内连接,可以连接省略条件!
on可以省略:相当于连接条件永远成立!
返回值是一个 笛卡尔积!
### 外连接,left join,right join
分成:左外连接left join,右外连接right join!
连接的记录,可能是一方不存在的!(两条记录中,可能某条不存在)
总结:内连接,外连接差别不大,只是外连接会将没有连接成功的记录,也出现最终的连接的结果内,而内连接,连接的结果只有连接成功的(两条记录都存在的)
注意好左外与右外的区别:
区别在于,那个表的记录(指的是连接失败的记录),会最终出现在连接结果内?
什么是左表 和 右表?
join关键字前面的(左边的)左表,join关键字后边的(右边的)右表!
左外:如果出现左表记录连接不上右表记录的,左表记录会出现正在最终的连接结果内!而右表记录相应设置成NULL。
右外:如果出现右表记录连接不上左表记录的,右表记录会出现正在最终的连接结果内!而左表记录相应设置成NULL。
因此,可以交换 表的位置,达到使用left与right join 混用的的目的!
问题:
统计 每个班级内,学生的数量!,在班级列表内:
班级名,教室,学生数量
注意,外连接应该有条件!
### 交叉连接,cross join
结果与 内连接一致!
有时,在获得笛卡尔积时,显式的使用 交叉连接!
交叉连接 相当于 是 没有条件的内连接!
### 自然连接,natural join
mysql,自动判断连接条件,帮助我们完成连接!
典型的条件就是,表中的同名字段!
而自然连接也分 内连接与外连接!
自然内连接:natural join
自然左外:natural left join
自然右外:natual right join
总结:
最终的效果只有:内,左外,右外!
交叉,特殊的内!
自然,相当于自动判断连接条件,完成内,左外,右外!
连接条件,on,using
-------------
on,后面使用一个连接条件表达式!
using(连接字段),要求使用同名字段进行连接!
using 的特别地方:
会对字段列表做一次整理!将连接字段作为一次显示!
练习
设计一个系统,保存乒乓球联赛的比赛信息!
队员就是 学生
记录比赛信息:比赛表
做一个比赛信息公告板,要求格式如下:
比赛时间 选手1名字 比赛结果 选手2名字
比赛时间 选手1ID 比赛结果 选手2ID
比赛时间 选手1名字 比赛结果 选手2ID
比赛时间 选手1名字 比赛结果 选手2名字
此时,可以对 学生表 再次连接!
出现 一个表在一次查询时,被多次使用!注意,保证使用时没有歧义!为表起别名!
union查询,联合查询
============
将 多个查询的结果,并列到一个结果集合内!
此时,获得所有男生,按照身高升序排序。
获得所有的女生,按照身高降序排序。
此时 :
此时,将两个结果联合起来:
注意,在union是,如果子句中出现了 order by,则需要子句出现在小括号内!
此时,子句的order by 也会在union的时候,会忽视掉! 需要子句配合limit一起使用order by
union 的连接的两个子句,不要求实同表,只要求,列的数量相同!
union会在联合时:主动去掉相同的记录:此时,可以使用 all关键字 加以修正:
select语句的选项
===========
distinct,取消相同的记录
默认是 all,可以不写,表示所有的记录都出现!
作业
==
1连接查询练习:
做乒乓球比赛 公告页面:
点击进入,选手详细页:
接下来,进入班级信息页
1, 设计,如果当前是篮球比赛呢?
设计,球队,球员,比赛之间的关系!
比赛列表
----
result.php
需要点击时,传递,参数,能够标识当前运动员的参数!
选择传递 ID 比较好!
查询时,应该将两位运动员的ID查询出来!
运动员信息简介
-------
player.php
自然信息:
比赛信息
班级信息
----
class.php
在链接上增加班级id参数:
删除数据,delete,truncate
====================
delete时,支持 order by 和 limit 来限制删除的数据记录!
delete from table\_name;
此时没有where子句,表示所有记录都删除!
如果清空表,此时可以独立使用 truncate 语句,完成清空表
注意与 delete from table的区别:
truncate 是删除表后重建表!
droptable,create table;
delete 是,得到每条记录,逐一删除!
导致的结果,效率上有差别,truncate效率高些!
更新,update
=========
类似于删除,也可以使用 order by 和 limit 确定更新的记录!
![](FDCA1BF2C7E3720BE0F80E6125EFBEF2.png)
上一篇: 22 视图 事务